﻿using System;
using System.Collections.Generic;
using System.ServiceModel;
using StockholmsStad.Runtime.Serialization.DataContract;
using StockholmsStad.Utilities.Exceptions;
using StockholmsStad.Runtime.Serialization.DataContract.Enums;

namespace StockholmsStad.ServiceModel.Interfaces
{
    /// <summary>
    /// 
    /// </summary>
    [ServiceContract]
    public interface IMaintenanceService
    {
        //TODO Flytta alla metoder som har med Maintenance till denna tjänst

        /// <summary>
        /// Operationskontrakt som hämtar alla par som kan avpersonifieras.
        /// </summary>
        /// <param name="user">Den inloggade användaren (<see cref="User"/>).</param>
        /// <param name="fromDate">Fråndatum</param>
        /// <param name="toDate">Tilldatum</param>
        /// <returns>En lista av typen <see cref="CouplesSummaryItem"/> med alla par som kan avpersonifieras.</returns>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        IList<Couple> GetCouplesForDepersonation(User user, DateTime fromDate, DateTime toDate);

        /// <summary>
        /// Operationskontrakt som hämtar alla par som kan avpersonifieras.
        /// </summary>
        /// <param name="user">Den inloggade användaren (<see cref="User"/>).</param>
        /// <param name="couples">Fråndatum</param>
        /// <returns>En lista av typen <see cref="CouplesSummaryItem"/> med alla par som kan avpersonifieras.</returns>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        int DepersonateCouples(User user, List<Couple> couples);


        /// <summary>
        /// Operationskontrakt som hämtar databasens version.
        /// </summary>
        /// <param name="user">Den inloggade användaren (<see cref="User"/>).</param>
        /// <returns>En version <see cref="StockholmsStad.Data.Entity.Version"/></returns>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        string GetDatabaseVersion(User user);

        /// <summary>
        /// Operationskontrakt som hämtar tjänstelagrets version.
        /// </summary>
        /// <param name="user">Den inloggade användaren (<see cref="User"/>).</param>
        /// <returns>Ett versionsnummer </returns>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        string GetServiceVersion(User user);

        /// <summary>
        /// Operationskontrakt som uppdaterar ett språk
        /// </summary>
        /// <param name="user">Den inloggade användaren (<see cref="User"/>).</param>
        /// <param name="language">Språket</param>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        void UpdateLanguage(User user, ValueIdPair language);

        /// <summary>
        /// Operationskontrakt som tar bort ett språk
        /// </summary>
        /// <param name="user">Den inloggade användaren (<see cref="User"/>).</param>
        /// <param name="language">Språket</param>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        void DeleteLanguage(User user, ValueIdPair language);

        /// <summary>
        /// Operationskontrakt som tar bort ett ceremoni språk
        /// </summary>
        /// <param name="user">Den inloggade användaren (<see cref="User"/>).</param>
        /// <param name="language">Språket</param>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        void DeleteCeremonyLanguage(User user, ValueIdPair language);

        /// <summary>
        /// Operationskontrakt som tar bort ett certifikat språk
        /// </summary>
        /// <param name="user">Den inloggade användaren (<see cref="User"/>).</param>
        /// <param name="language">Språket</param>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        void DeleteCertificateLanguage(User user, ValueIdPair language);

        /// <summary>
        /// Hämtar lediga tillgängliga språk för en viss typ av certifikat. 
        /// </summary>
        /// <param name="user">Den inloggade användaren (<see cref="User"/>).</param>
        /// <param name="certificateType">Anger vilken typ som tillgängliga språk finns för. </param>
        /// <returns>En lista med språk (<see cref="ValueIdPair"/>).</returns>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        List<ValueIdPair> GetAvailableLanguagesForReportDefinition(User user, MarriageCertificateType certificateType);

        /// <summary>
        /// Hämtar alla tillgängliga språk för en viss typ av certifikat. 
        /// </summary>
        /// <param name="user">Den inloggade användaren (<see cref="User"/>).</param>
        /// <param name="certificateType">Anger vilken typ som tillgängliga språk finns för. </param>
        /// <returns>En lista med språk (<see cref="ValueIdPair"/>).</returns>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        List<ValueIdPair> GetLanguagesForCertificateType(User user, MarriageCertificateType certificateType);

        /// <summary>
        /// Skapar en ny rapportdefinition (en rapport med nytt språk och innehåll). 
        /// </summary>
        /// <param name="user">Den inloggade användaren (<see cref="User"/>).</param>
        /// <param name="certificate">Innehållet på den nya rapportdefinitionen. </param>
        /// <returns>Id-numret på den tillagda rapportdefinitionen. </returns>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        int AddMarriageCertificate(User user, MarriageCertificate certificate);

        /// <summary>
        /// Uppdaterar en befintlig rapportdefinition. 
        /// </summary>
        /// <param name="user">Den inloggade användaren (<see cref="User"/>).</param>
        /// <param name="certificate">Innehållet på rapportdefinitionen. </param>
        /// <returns> </returns>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        void UpdateMarriageCertificate(User user, MarriageCertificate certificate);

        /// <summary>
        /// Uppdaterar en befintlig rapportdefinition. 
        /// </summary>
        /// <param name="user">Den inloggade användaren (<see cref="User"/>).</param>
        /// <param name="certificate">Innehållet på rapportdefinitionen. </param>
        /// <returns> </returns>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        void DeleteMarriageCertificate(User user, MarriageCertificate certificate);

        /// <summary>
        /// Hämtar ett registreringsbevis. 
        /// </summary>
        /// <param name="user">Den inloggade användaren (<see cref="User"/>).</param>
        /// <param name="marriageCertificateType">Id-numret på det aktuella beviset. </param>
        /// <param name="languageId">Id-numret på det aktuella beviset. </param>
        /// <returns>Registreringsbeviset. </returns>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        MarriageCertificate GetMarriageCertificate(User user, MarriageCertificateType marriageCertificateType, int languageId);

        /// <summary>
        /// Hämtar befintliga affärsregler
        /// </summary>
        /// <param name="user">Den inloggade användaren (<see cref="User"/>).</param>
        /// <returns>De regler som gäller. </returns>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        ParVisProperties GetProperties(User user);

        /// <summary>
        /// Uppdaterar affärsregler. 
        /// </summary>
        /// <param name="user">Den inloggade användaren (<see cref="User"/>).</param>
        /// <param name="properties">De regler som ska uppdateras. </param>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        void SetProperties(User user, ParVisProperties properties);

        /// <summary>
        /// 
        /// </summary>
        /// <param name="user"></param>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        List<ValueIdPair> GetLanguages(User user);

        /// <summary>
        /// 
        /// </summary>
        /// <param name="user"></param>
        /// <param name="languageName"></param>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        int AddLanguage(User user, string languageName);

        /// <summary>
        /// 
        /// </summary>
        /// <param name="user"></param>
        /// <param name="name"></param>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        int AddSpecialNeed(User user, string name);

        /// <summary>
        /// 
        /// </summary>
        /// <param name="user"></param>
        /// <param name="name"></param>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        int AddCeremonyLanguage(User user, string name);

        /// <summary>
        /// 
        /// </summary>
        /// <param name="user"></param>
        /// <param name="name"></param>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        int AddCertificateLanguage(User user, string name);

        /// <summary>
        /// Hämtar alla texter av en viss typ. 
        /// </summary>
        /// <param name="user">Den inloggade användaren (<see cref="User"/>).</param>
        /// <param name="textTypeId">Id-värdet på den texttyp som ska hämtas. </param>
        /// <returns>En lista med texter. </returns>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        IList<InformationText> GetTexts(User user, int textTypeId);

        /// <summary>
        /// Hämtar alla typer av texter som finns
        /// </summary>
        /// <param name="user"></param>
        /// <returns>En lista med tillgängliga texttyper</returns>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        IList<ValueIdPair> GetTextTypes(User user);

        /// <summary>
        /// Hämtar en viss text. 
        /// </summary>
        /// <param name="user">Den inloggade användaren (<see cref="User"/>).</param>
        /// <param name="textId">Id-värdet på den text som ska hämtas. </param>
        /// <returns>En lista med texter. </returns>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        InformationText GetText(User user, int textId);

        /// <summary>
        /// Lägger till text. 
        /// </summary>
        /// <param name="user">Den inloggade användaren (<see cref="User"/>).</param>
        /// <param name="text">Den text som ska läggas till (<see cref="InformationText"/>). </param>
        /// <returns>Nyckeln på den tillagda texten. </returns>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        int AddText(User user, InformationText text);

        /// <summary>
        /// Updaterar text.
        /// </summary>
        /// <param name="user">Den inloggade användaren (<see cref="User"/>).</param>
        /// <param name="text">Den text som ska uppdateras (<see cref="InformationText"/>). </param>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        void UpdateText(User user, InformationText text);

        /// <summary>
        /// Ta bort text.
        /// </summary>
        /// <param name="user">Den inloggade användaren (<see cref="User"/>).</param>
        /// <param name="text">Den text som ska tas bort (<see cref="InformationText"/>). </param>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        void DeleteText(User user, InformationText text);

    }
}
